#pragma once

#include <mutex>

namespace singleton {
    
/// @brief 懒汉式单例. 类加载时没有生成单例, 第一次调用 getInstance 方法时才去创建
class LazySingleton {
public:
    LazySingleton* getInstance() { 
        if (!instance_) {
            std::unique_lock<std::mutex> lock(mutex_);
            if (!instance_) instance_ = new LazySingleton();    // 可能出现两个线程都执行了第一次 if 语句
        }
        return instance_; 
    }

private:
    LazySingleton() {}
    static LazySingleton* instance_;
    static std::mutex mutex_;
};

LazySingleton* LazySingleton::instance_ = nullptr;

} // namespace singleton
